package logica_de_presentacion;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.beans.PropertyVetoException;
import java.util.HashSet;

import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.InternalFrameEvent;
import javax.swing.event.InternalFrameListener;
import javax.swing.table.AbstractTableModel;

import comun.Serie;
import comun.SigueSerie;
import comun.Usuario;
import logica_de_negocio.ExcepDeleteOnCascade;
import logica_de_negocio.FaltanDatosEnLaBaseDeDatos;
import logica_de_negocio.GestorSigueSerie;
import logica_de_negocio.excepAnadirDupli;
import logica_de_negocio.gestorSerie;

public class TablaSerie extends JInternalFrame implements ActionListener,
		InternalFrameListener {

	private static final long serialVersionUID = 1L;
	private JTable tablaDatos;
	private JButton jbDetalles, jbEliminarSeguir, jbModificar, jbSalir;
	private JScrollPane scrollPane;
	private JPanel jpBotones;
	private HashSet<Serie> ls;
	private MenuInicial clasePadre;
	private FormularioAnadirModificarSerie formularioAnadirSerie;
	private Usuario usuarioActual;

	public TablaSerie(MenuInicial clasePadre, Usuario usuarioActual) {

		super("Listar serie", true, false, false, false);
		this.setVisible(true);
		this.setSize(500, 500);
		this.clasePadre = clasePadre;
		this.usuarioActual = usuarioActual;
		this.subCompo();
	}

	public void subCompo() {

		this.getContentPane().setLayout(new BorderLayout());
		// TABLA
		// CREAMOS UN SCROLLPANE Y LE ANADIMOS LA TABLA
		scrollPane = new JScrollPane(tablaDatos);
		// ANADIMOS EL SCROLLPANE AL PANEL
		this.add(scrollPane, "Center");
		jpBotones = new JPanel(new FlowLayout());
		jbDetalles = new JButton("Ver detalles");
		jbDetalles.addActionListener(this);
		jbDetalles.setMnemonic(KeyEvent.VK_V);
		jbDetalles
				.setToolTipText("Muestra mas detalles de la serie selecionada");
		jpBotones.add(jbDetalles);
		if (usuarioActual.isEsAdmin()) {
			jbModificar = new JButton("Modificar");
			jbModificar.addActionListener(this);
			jbModificar.setMnemonic(KeyEvent.VK_M);
			jbModificar
					.setToolTipText("Modificar la serie de la base de datos");
			jpBotones.add(jbModificar);

			jbEliminarSeguir = new JButton("Eliminar");
			jbEliminarSeguir.addActionListener(this);
			jbEliminarSeguir.setMnemonic(KeyEvent.VK_E);
			jbEliminarSeguir
					.setToolTipText("Eliminar la serie de la base de datos");
			jpBotones.add(jbEliminarSeguir);
		} else {
			jbEliminarSeguir = new JButton("Seguir");
			jbEliminarSeguir.addActionListener(this);
			jbEliminarSeguir.setMnemonic(KeyEvent.VK_S);
			jbEliminarSeguir.setToolTipText("Seguir o dejar deseguir la serie");
			jpBotones.add(jbEliminarSeguir);
		}
		jbSalir = new JButton("Salir");
		jbSalir.addActionListener(this);
		jbSalir.setMnemonic(KeyEvent.VK_S);
		jbSalir.setToolTipText("Salir  de la tabla");
		jpBotones.add(jbSalir);

		this.getContentPane().add(jpBotones, "South");
	}
	@Override
	public void actionPerformed(ActionEvent e) {

		JButton botonPulsado = (JButton) e.getSource();
		gestorSerie gs = new gestorSerie();
		if (botonPulsado == jbDetalles) {
			try {

				String titulo = (String) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 0);

				try {
					Serie s = gs.getSerie(titulo);
					JOptionPane.showMessageDialog(new Frame(), s.toString());
				} catch (FaltanDatosEnLaBaseDeDatos e1) {
					JOptionPane.showMessageDialog(new Frame(), e1.getFalta());
				} catch (ClassNotFoundException e1) {
					JOptionPane
					.showMessageDialog(null,
							"No existe la base de datos comprueba que existe el archivo sqlite");
					this.dispose();
				}
			} catch (IndexOutOfBoundsException sinEle) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay niguna fila selecionada");
			}
		}
		if (botonPulsado == jbModificar) {

			try {
				String titulo = (String) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 0);

				try {
					Serie s = gs.getSerie(titulo);
					formularioAnadirSerie = new FormularioAnadirModificarSerie(
							true, s.getEMMY(), s.getFecha_ini(),
							s.getFecha_fin());
					formularioAnadirSerie.cargarMO(s);
					formularioAnadirSerie.addInternalFrameListener(this);
					clasePadre.getPanelEscritorio().add(formularioAnadirSerie);
					formularioAnadirSerie.setSelected(true);
					formularioAnadirSerie.setVisible(true);
					formularioAnadirSerie.toFront();

				} catch (FaltanDatosEnLaBaseDeDatos e1) {
					JOptionPane.showMessageDialog(new Frame(), e1.getFalta());
				} catch (PropertyVetoException e1) {

				} catch (ClassNotFoundException e1) {
					JOptionPane
					.showMessageDialog(null,
							"No existe la base de datos comprueba que existe el archivo sqlite");
					this.dispose();
				}
			} catch (IndexOutOfBoundsException sinEle) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay niguna fila selecionada");
			}
		}

		if (botonPulsado == jbEliminarSeguir) {
			try {
				String titulo = (String) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 0);

				Serie s;
				try {
					s = gs.getSerie(titulo);
					if (usuarioActual.isEsAdmin()) {
						eliminarSerie(s);
					} else {
						GestorSigueSerie gss = new GestorSigueSerie();
						SigueSerie ss = null;
						try {
							ss = new SigueSerie(usuarioActual.getId_u(),
									s.getId_s());
							if(gss.addSigueSerie(ss)){
								//SE ANADE O SALTA UNA EXCEPCION
								JOptionPane.showMessageDialog(new Frame(), "Serie seguida con exito");
								this.refreshTable();
							}else{
								JOptionPane.showMessageDialog(new Frame(), "Serie NO seguida con exito");
							}
						} catch (excepAnadirDupli ead) {
							int res = JOptionPane
									.showConfirmDialog(new Frame(),
											"Ya sigue esta serie desea dejar de seguirla?");
							if (res == 0) {
								try {
									gss.deleteSigueSerie(ss);
									this.refreshTable();
								} catch (ClassNotFoundException e1) {
									JOptionPane
									.showMessageDialog(null,
											"No existe la base de datos comprueba que existe el archivo sqlite");
									this.dispose();
								}
							}
						}
					}

				} catch (FaltanDatosEnLaBaseDeDatos e1) {
					JOptionPane.showMessageDialog(new Frame(), e1.getFalta());
				} catch (ClassNotFoundException e2) {
					JOptionPane
					.showMessageDialog(null,
							"No existe la base de datos comprueba que existe el archivo sqlite");
					this.dispose();
				}
			} catch (IndexOutOfBoundsException sinEle) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay niguna fila selecionada");
			}
		}

		if (botonPulsado == jbSalir) {
			this.dispose();
		}
	}

	public void cargarSerie() throws ClassNotFoundException {
		gestorSerie gs = new gestorSerie();
		gs.cargarDatos();
		ls = gs.getSeries();
		crearTabla();
		this.setVisible(true);
		subCompo();
	}

	public void crearTabla() {

		tablaDatos = null;// VACIAMOS SI EXISTE ALUGUNA
		myTable tmp = new myTable();
		tablaDatos = new JTable(tmp);

		tablaDatos.setPreferredScrollableViewportSize(new Dimension(200, 200));
		tablaDatos.setEnabled(true);

		// QUE PODAMOS SELECIONAR LAS FILAS
		tablaDatos.setRowSelectionAllowed(true);

		// QUE SE ACTUALICE (La tabla que contiene)
		tmp.fireTableDataChanged();

		// SI QUEREMOS QUE LA TABLA LLENE POR COMPLETO LA VENTANA EN LA ALTURA
		tablaDatos.setFillsViewportHeight(false);

		// CREAR UNA ORDENACION AUTOMATICA
		tablaDatos.setAutoCreateRowSorter(true);

	}

	private void refreshTable() throws ClassNotFoundException {
		gestorSerie gs = new gestorSerie();
		gs.cargarDatos();
		ls = gs.getSeries();
		myTable tpm = (myTable) tablaDatos.getModel();
		tpm.setData();
		tpm.fireTableDataChanged();

	}

	private void eliminarSerie(Serie s) throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {

		boolean corec = false;

		gestorSerie gs = new gestorSerie();

		try {
			corec = gs.borrar(s.getId_s(), new ExcepDeleteOnCascade());
		} catch (ExcepDeleteOnCascade e) {
			int res = JOptionPane
					.showConfirmDialog(
							new Frame(),
							"Al eliminar la serie tambien se eliminaran los capitulo, los comentarios de los usuarios y estos dejaran de seguir la serie");
			// YES=0, NO=1,Cancel =2
			if (res == 0) {
				e.setAceptado(true);
				try {
					corec = gs.borrar(s.getId_s(), e);
				} catch (ExcepDeleteOnCascade e1) {
				}
			}
		}
		if (corec == true) {
			JOptionPane.showMessageDialog(new Frame(),
					"Se ha borrado correctamente la serie");
			this.refreshTable();
		} else {
			JOptionPane.showMessageDialog(new Frame(),
					"No se ha borrado correctamente la serie");
		}
	}

	class myTable extends AbstractTableModel {

		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;
		private String[] columName;
		private Object[][] data;

		public myTable() {

			super();
			
			if(usuarioActual.isEsAdmin()){
				String [] col={ "Titulo", "Director", "Pais", "N EMMY",
						"Fecha de inicio de emision", "Fecha de fin de emision" };
				columName=new String[6];
				columName=col;
			}else{
				String [] col={ "Titulo", "Director", "Pais", "N EMMY",
						"Fecha de inicio de emision", "Fecha de fin de emision","Se Sigue" };
				columName=new String[7];
				columName=col;
			}	
			setData();		
		}
		@Override
		public int getColumnCount() {
			return columName.length;
		}
		@Override
		public int getRowCount() {
			return data.length;
		}
		@Override
		public String getColumnName(int col) {
			return columName[col];
		}
		@Override
		public Object getValueAt(int row, int col) {

			return data[row][col];
		}

		public void setData() {

			int filas = ls.size();
			int cont = 0;

			data = new Object[filas][];

			// RELLENO DATOS
			for (Serie s : ls) {

				if (usuarioActual.isEsAdmin()) {
					Object[] a = { s.getTitulo(), s.getDirector(), s.getPais(),
							s.getEMMY(), s.getFecha_ini(), s.getFecha_fin() };
					data[cont] = a;
					cont++;
				} else {
					Object[] a = { s.getTitulo(), s.getDirector(), s.getPais(),
							s.getEMMY(), s.getFecha_ini(), s.getFecha_fin(),
							serieSigue(s.getId_s()) };
					data[cont] = a;
					cont++;
				}
			}
		}
	}

	public boolean serieSigue(int id_s) {
		
		GestorSigueSerie gss = new GestorSigueSerie();
		boolean dev=gss.laSigue(id_s, usuarioActual.getId_u());
		return dev;
	}
	@Override
	public void internalFrameOpened(InternalFrameEvent e) {
	}
	@Override
	public void internalFrameClosing(InternalFrameEvent e) {
	}
	@Override
	public void internalFrameClosed(InternalFrameEvent e) {

		if (e.getSource() == formularioAnadirSerie) {// SE HAN MODIFICADO
														// COSAS
			try {
				this.refreshTable();
			} catch (ClassNotFoundException e1) {
				JOptionPane
				.showMessageDialog(null,
						"No existe la base de datos comprueba que existe el archivo sqlite");
				this.dispose();
			}
		}
	}
	@Override
	public void internalFrameIconified(InternalFrameEvent e) {
	}
	@Override
	public void internalFrameDeiconified(InternalFrameEvent e) {
	}
	@Override
	public void internalFrameActivated(InternalFrameEvent e) {
	}
	@Override
	public void internalFrameDeactivated(InternalFrameEvent e) {
	}
}
